/*

题目描述

利用虚函数实现多态：

  （1）设计Person类，要求具有用于表示姓名的保护数据成员：string szName；
	实现信息打印的公有成员函数：void Print()。
	其中，Print函数设计为虚函数，输出的信息格式为：“Person 姓名”。

  （2）从Person类派生Student类，添加用于表示学号的保护数据成员：int iNumber；
	重定义用于信息打印的公有成员函数：void Print()。
	其中，Print函数输出的信息格式为：“Student 姓名 学号”。

  （3）从 Person类派生Teacher类，添加用于表示教龄的保护数据成员：int iYear；
	重定义用于信息打印的公有成员函数：void Print()。
	其中，Print函数输出的信息格式为：“Teacher 姓名 教龄”。

  （4）从Student类派生Graduate类，添加用于表示研究方向的保护数据成员：string szResearch；
	重定义用于信息打印的公有成员函数：void Print()。
	其中，Print函数输出的信息格式为：“Graduate 姓名 研究方向”。



  在main函数中根据用输入的整数动态创建一个Person类的对象指针数组。
用户依次输入对象信息(对象类别及其相应的数据成员值)，根据对象类别动
态创建相应的对象并赋给相应的对象指针数组元素。全部录入后，根据用户输入
要显示的对象信息在数组中的位置，调用Print函数在屏幕上打印出相应对象的
信息。如果用户输入“exit”，则退出。
输入

对象指针数组的长度；

对象类型及对象信息(输入方式见输入样例)；

要显示的对象在数组中的位置；

exit

输出

用户要求显示的对象信息。
样例输入

4
Person Zhang
Student Zhao 200905
Graduate Li 200905 DataMining
Teacher Luo 10
0
2
exit

样例输出

Person Zhang
Graduate Li 200905 DataMining
*/
#include <iostream>
#include <string>
#include <cstdlib>

using namespace std;

class Person
{
public:
	Person() {}
	Person(string Name);
	~Person() {}
	virtual void Print();
protected:
	string szName;
};

class Student : public Person
{
public:
	Student() {}
	Student(string Name, int number);
	~Student() {}
	void Print();
protected:
	int iNumber;
};

class Teacher : public Person
{
public:
	Teacher() {}
	Teacher(string Name, int Year);
	~Teacher() {}
	void Print();
protected:
	int iYear;
};

class Graduate : public Student
{
public:
	Graduate() {}
	Graduate(string Name, int number, string Research);
	~Graduate() {}
	void Print();
protected:
	string szResearch;
};

int operate(string status)
{
	if (status == "Person") {
		return -1;
	}
	else if (status == "Student") {
		return -2;
	}
	else if (status == "Graduate") {
		return -3;
	}
	else if (status == "Teacher") {
		return -4;
	}
}

int main()
{
	int num;
	cin >> num;
	Person* *persons = new Person * [num];
	for (int i = 0; i < num; i++) {
		string status;
		cin >> status;
		int status_operate = operate(status);
		switch (status_operate) {
			case -1: {
				string Name;
				cin >> Name;
				persons[i] = new Person(Name);
				break;
			}
			case -2: {
				string Name; int number;
				cin >> Name >> number;
				persons[i] = new Student(Name, number);
				break;
			}
			case -3: {
				string Name; int number; string Research;
				cin >> Name >> number >> Research;
				persons[i] = new Graduate(Name, number, Research);
				break;
			}
			case -4: {
				string Name; int Year;
				cin >> Name >> Year;
				persons[i] = new Teacher(Name, Year);
				break;
			}
			default: {
				break;
			}
		}
	}
	string status("\0");
	while (status != "exit") {
		cin >> status;
		if (status != "exit") {
			int num = atoi(status.c_str());
			persons[num]->Print();
		}
	}
	return 0;
}

Person::Person(string Name) :
	szName(Name)
{}

void Person::Print()
{
	cout << "Person " << szName << endl;
}

Student::Student(string Name, int number) :
	Person(Name)
{
	iNumber = number;
}

void Student::Print()
{
	cout << "Student " << szName << " "
		<< iNumber << endl;
}

Teacher::Teacher(string Name, int Year) :
	Person(Name)
{
	iYear = Year;
}

void Teacher::Print()
{
	cout << "Teacher " << szName << " "
		<< iYear << endl;
}

Graduate::Graduate(string Name, int number, string Research) :
	Student(Name, number)
{
	szResearch = Research;
}

void Graduate::Print()
{
	cout << "Graduate " << szName << " " 
		<< iNumber << " "
		<< szResearch << endl;
}